package Servlet;

import java.io.IOException;
import java.util.ArrayList;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Sessions.RecuperaDatiSessionRemote;
import EntityBeans.Indirizzo;
import EntityBeans.PossessoAbilita;
import EntityBeans.UtenteRegistrato;

/**
 * Servlet implementation class CercaServlet
 */
public class CercaUtenteRegServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private RequestDispatcher d;
	private GestoreContesto contesto;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CercaUtenteRegServlet() {
        super();
        contesto = new GestoreContesto();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			eseguiRichiesta(request, response);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			eseguiRichiesta(request, response);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	private void eseguiRichiesta(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, NamingException {
		
		RecuperaDatiSessionRemote gestore = contesto.getGestore(RecuperaDatiSessionRemote.class, "RecuperaDatiSessionRemote");
		
		String idSessione = request.getParameter("idSessione");
		
		String nome = request.getParameter("nome");
		String cognome = request.getParameter("cognome");
		String paese = request.getParameter("paese");
		String nazione = request.getParameter("nazione");
		String abilita = request.getParameter("abilita");
		String idAbilita = request.getParameter("idAbilita");
		
		if (!nome.equals("") && !cognome.equals("") && !paese.equals("") && !nazione.equals("") && !abilita.equals("") && !idAbilita.equals("")){
			
			//Tutti gli utenti
			ArrayList<UtenteRegistrato> allUtenti = gestore.recuperaUtenteRegistrato();
			
			//Creo ArrayList degli utenti che hanno nome e cognome selezionati
			ArrayList<UtenteRegistrato> utentiCorrispondenti = ricercaUtenti(nome,cognome,allUtenti);
			if (utentiCorrispondenti.size()==0) {
				request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
				request.setAttribute("idSessione", idSessione);
				d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
				d.forward(request, response);
			}
			else{
				//Tutti gli indirizzi
				ArrayList<Indirizzo> allIndirizzi = gestore.recuperaIndirizzo();
				
				//Creo un ArrayList di indirizzi corrispondenti ai parametri
				ArrayList<Indirizzo> indirizziCorrispondenti = ricercaIndirizzi(paese,nazione,allIndirizzi);
				if (indirizziCorrispondenti.size()==0) {
					request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
					request.setAttribute("idSessione", idSessione);
					d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
					d.forward(request, response);
				}
				else{
					//Utenti che abitano nell'indirizzo selezionato
					ArrayList<UtenteRegistrato> utenti = utentiRegolari(utentiCorrispondenti,indirizziCorrispondenti);
					if (utenti.size()==0) {
						request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
						request.setAttribute("idSessione", idSessione);
						d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
						d.forward(request, response);
					}
					else{
						//Tutte le relazione di possesso abilita
						ArrayList<PossessoAbilita> allPossessoAbilita = gestore.recuperaPossessoAbilita();
						
						//utenti con l'abilita selezionata
						ArrayList<UtenteRegistrato> utenteCercato = utentiCercati (utenti, allPossessoAbilita, idAbilita);
						if (utenteCercato.size()==0) {
							request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
							request.setAttribute("idSessione", idSessione);
							d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
							d.forward(request, response);
						}
						else {
							for(int i=0; i<utenteCercato.size(); i++){
								request.setAttribute("id" + i, utenteCercato.get(i).getId());
								request.setAttribute("nome" + i, utenteCercato.get(i).getNome());
								request.setAttribute("cognome" + i, utenteCercato.get(i).getCognome());
							}
							request.setAttribute("size", utenteCercato.size());
							request.setAttribute("idSessione",idSessione);
							d=request.getRequestDispatcher("RisultatiRicercaUtentiReg.jsp");
							d.forward(request, response);
						}
					}
					
					
				}
				
				
			}
			
			
			
		} //fine dell'if che contralla che tutti i campi siano pieni
		else {
			if(paese.equals("") || nazione.equals("") || abilita == null){
				request.setAttribute("msg", "i campi paese, nazione e abilita sono obbligatori per una corretta ricerca");
				request.setAttribute("idSessione", idSessione);
				d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
				d.forward(request, response);
			}//fine dell'if che manda alla pagina di errore a causa di mancanza dati obbligatori
			else {
				if (cognome.equals("") && nome.equals("")){
					//Tutti gli indirizzi
					ArrayList<Indirizzo> allIndirizzi = gestore.recuperaIndirizzo();
					
					//Creo un ArrayList di indirizzi corrispondenti ai parametri
					ArrayList<Indirizzo> indirizziCorrispondenti = ricercaIndirizzi(paese,nazione,allIndirizzi);
					if (indirizziCorrispondenti.size()==0) {
						request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
						request.setAttribute("idSessione", idSessione);
						d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
						d.forward(request, response);
					}
					else {
						//Prendo tutti gli utenti del sistema
						ArrayList<UtenteRegistrato> allUtenti = gestore.recuperaUtenteRegistrato();
						
						//Creo un ArrayList di utenti che abitano all'indirizzo selezionato
						ArrayList<UtenteRegistrato> utentiAtIndirizzo = utentiAtIndirizzo(allUtenti,indirizziCorrispondenti);
						
						//Tutte le relazione di possesso abilita
						ArrayList<PossessoAbilita> allPossessoAbilita = gestore.recuperaPossessoAbilita();
						
						//utenti con l'abilita selezionata
						ArrayList<UtenteRegistrato> utenteCercato = utentiCercati (utentiAtIndirizzo, allPossessoAbilita, idAbilita);
						if (utenteCercato.size()==0) {
							request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
							request.setAttribute("idSessione", idSessione);
							d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
							d.forward(request, response);
						}
						else {
							for(int i=0; i<utenteCercato.size(); i++){
								request.setAttribute("id" + i, utenteCercato.get(i).getId());
								request.setAttribute("nome" + i, utenteCercato.get(i).getNome());
								request.setAttribute("cognome" + i, utenteCercato.get(i).getCognome());
							}
							
							request.setAttribute("size", utenteCercato.size());
							request.setAttribute("idSessione", idSessione);
							d=request.getRequestDispatcher("RisultatiRicercaUtentiReg.jsp");
							d.forward(request, response);
						}
						
					}
					
				}//fine dell'if che cerca utenti senza nome e cognome
				else {
					if (!nome.equals("") && cognome.equals("")){
						//Tutti gli indirizzi
						ArrayList<Indirizzo> allIndirizzi = gestore.recuperaIndirizzo();
						
						//Creo un ArrayList di indirizzi corrispondenti ai parametri
						ArrayList<Indirizzo> indirizziCorrispondenti = ricercaIndirizzi(paese,nazione,allIndirizzi);
						if (indirizziCorrispondenti.size()==0) {
							request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
							request.setAttribute("idSessione", idSessione);
							d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
							d.forward(request, response);
						}
						else {
							//Prendo tutti gli utenti del sistema
							ArrayList<UtenteRegistrato> allUtenti = gestore.recuperaUtenteRegistrato();
							
							//Creo un ArrayList con Utenti con nome indicato
							ArrayList<UtenteRegistrato> utentiConNome = utentiConNome(allUtenti,nome);
							if (utentiConNome.size()==0) {
								request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
								request.setAttribute("idSessione", idSessione);
								d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
								d.forward(request, response);
							}
							else {
								//Confronto Indirizzi con utenti
								ArrayList<UtenteRegistrato> utentiNomeIndirizzo = utentiRegolari(utentiConNome, indirizziCorrispondenti);
								
								//Tutte le relazione di possesso abilita
								ArrayList<PossessoAbilita> allPossessoAbilita = gestore.recuperaPossessoAbilita();
								
								//utenti con l'abilita selezionata
								ArrayList<UtenteRegistrato> utenteCercato = utentiCercati (utentiNomeIndirizzo, allPossessoAbilita, idAbilita);
								if (utenteCercato.size()==0) {
									request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
									request.setAttribute("idSessione", idSessione);
									d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
									d.forward(request, response);
								}
								else {
									for(int i=0; i<utenteCercato.size(); i++){
										request.setAttribute("id" + i, utenteCercato.get(i).getId());
										request.setAttribute("nome" + i, utenteCercato.get(i).getNome());
										request.setAttribute("cognome" + i, utenteCercato.get(i).getCognome());
									}
								}
								request.setAttribute("size", utenteCercato.size());
								request.setAttribute("idSessione", idSessione);
								d=request.getRequestDispatcher("RisultatiRicercaUtentiReg.jsp");
								d.forward(request, response);
							}
							
						}
						
					}//fine dell'if che cerca utilizzando solo il nome
					else{
						if (nome.equals("") && !cognome.equals("")){
							//Tutti gli indirizzi
							ArrayList<Indirizzo> allIndirizzi = gestore.recuperaIndirizzo();
							
							//Creo un ArrayList di indirizzi corrispondenti ai parametri
							ArrayList<Indirizzo> indirizziCorrispondenti = ricercaIndirizzi(paese,nazione,allIndirizzi);
							if (indirizziCorrispondenti.size()==0) {
								request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
								request.setAttribute("idSessione", idSessione);
								d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
								d.forward(request, response);
							}
							else {
								//Prendo tutti gli utenti del sistema
								ArrayList<UtenteRegistrato> allUtenti = gestore.recuperaUtenteRegistrato();
								
								//Creo un ArrayList con Utenti con nome indicato
								ArrayList<UtenteRegistrato> utentiConCognome = utentiConCognome(allUtenti,cognome);
								if (utentiConCognome.size()==0) {
									request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
									request.setAttribute("idSessione", idSessione);
									d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
									d.forward(request, response);
								}
								else{
									//Confronto Indirizzi con utenti
									ArrayList<UtenteRegistrato> utentiNomeIndirizzo = utentiRegolari(utentiConCognome, indirizziCorrispondenti);
									
									//Tutte le relazione di possesso abilita
									ArrayList<PossessoAbilita> allPossessoAbilita = gestore.recuperaPossessoAbilita();
									
									//utenti con l'abilita selezionata
									ArrayList<UtenteRegistrato> utenteCercato = utentiCercati (utentiNomeIndirizzo, allPossessoAbilita, idAbilita);
									if (utenteCercato.size()==0) {
										request.setAttribute("msg", "Nessun iscritto corrisponde ai criteri selezionati");
										request.setAttribute("idSessione", idSessione);
										d=request.getRequestDispatcher("ErroreUtenteReg.jsp");
										d.forward(request, response);
									}
									else {
										for(int i=0; i<utenteCercato.size(); i++){
											request.setAttribute("id" + i, utenteCercato.get(i).getId());
											request.setAttribute("nome" + i, utenteCercato.get(i).getNome());
											request.setAttribute("cognome" + i, utenteCercato.get(i).getCognome());
										}
									}
									request.setAttribute("size", utenteCercato.size());
									request.setAttribute("idSessione", idSessione);
									d=request.getRequestDispatcher("RisultatiRicercaUtentiReg.jsp");
									d.forward(request, response);
								}
								
							}
							
							
						}//fine dell'if che cerca utilizzando solo il cognome
					}
				}
			}
		}
	}
	
	//FUNZIONI PRIVATE
	
	//Funzione che confronta tutti gli utenti con i parametri nome e cognome
	private ArrayList<UtenteRegistrato> ricercaUtenti (String nome, String cognome, ArrayList<UtenteRegistrato> allUtenti){
		ArrayList<UtenteRegistrato> risultato = new ArrayList<UtenteRegistrato>();
		for (int i=0; i<allUtenti.size(); i++){
			if (allUtenti.get(i).getNome().equals(nome) && allUtenti.get(i).getCognome().equals(cognome)){
				risultato.add(allUtenti.get(i));
			}
		}
		return risultato;
	}
	
	//Funzione che confronta gli indirizzi con i parametri
	private ArrayList<Indirizzo> ricercaIndirizzi (String paese, String nazione, ArrayList<Indirizzo> allIndirizzi){
		ArrayList<Indirizzo> risultato = new ArrayList<Indirizzo>();
		for (int i=0; i<allIndirizzi.size(); i++){
			if (allIndirizzi.get(i).getPaese().equals(paese) && allIndirizzi.get(i).getNazione().equals(nazione)){
				risultato.add(allIndirizzi.get(i));
			}
		}
		return risultato;
	}
	
	//Funzione che verifica che ci siano utenti che abitano nell'indirizzo selezionato
	private ArrayList<UtenteRegistrato> utentiRegolari (ArrayList<UtenteRegistrato> utentiCorrispondenti, ArrayList<Indirizzo> indirizziCorrispondenti ){
		ArrayList<UtenteRegistrato> risultato = new ArrayList<UtenteRegistrato>();
		for (int i=0; i<utentiCorrispondenti.size();i++){
			for (int j=0; j<indirizziCorrispondenti.size();j++){
				if (utentiCorrispondenti.get(i).getNomevia().equals(indirizziCorrispondenti.get(j).getNomevia()) && utentiCorrispondenti.get(i).getNumerocivico().equals(indirizziCorrispondenti.get(j).getNumerocivico()) && utentiCorrispondenti.get(i).getCap()==indirizziCorrispondenti.get(j).getCap()){
					risultato.add(utentiCorrispondenti.get(i));
				}
			}
		}
		return risultato;
	}
	
	//Funzione che prende gli utenti selezionati e controlla che abbiano l'abilita selezionata
	private ArrayList<UtenteRegistrato> utentiCercati (ArrayList<UtenteRegistrato> utenti, ArrayList<PossessoAbilita> allPossessoAbilita, String idAbilita){
		ArrayList<UtenteRegistrato> risultato = new ArrayList<UtenteRegistrato>();
		for (int i=0; i<utenti.size();i++){
			if(allPossessoAbilita!=null){
				for (int j=0; j<allPossessoAbilita.size(); j++){
					if(utenti.get(i).getId().equals(allPossessoAbilita.get(j).getIdutente()) && allPossessoAbilita.get(j).getIdabilita().equals(idAbilita)){
						risultato.add(utenti.get(i));
					}
				}
			}
			
		}
		return risultato;
	}
	
	//Funzione che prende gli utenti che abitano in un determinato indirizzo
	private ArrayList<UtenteRegistrato> utentiAtIndirizzo (ArrayList<UtenteRegistrato> allUtenti, ArrayList<Indirizzo> indirizziCorrispondenti){
		ArrayList<UtenteRegistrato> risultato = new ArrayList<UtenteRegistrato>();
		for (int i=0; i<allUtenti.size();i++){
			for (int j=0; j<indirizziCorrispondenti.size();j++){
				if(allUtenti.get(i).getCap()==indirizziCorrispondenti.get(j).getCap() && allUtenti.get(i).getNomevia().equals(indirizziCorrispondenti.get(j).getNomevia()) && allUtenti.get(i).getNumerocivico().equals(indirizziCorrispondenti.get(j).getNumerocivico()) ){
					risultato.add(allUtenti.get(i));
				}
			}
		}
		return risultato;
	}
	
	//Funzione che prende gli utenti in base solo al nome
	private ArrayList<UtenteRegistrato> utentiConNome (ArrayList<UtenteRegistrato> allUtenti, String nome){
		ArrayList<UtenteRegistrato> risultato = new ArrayList<UtenteRegistrato>();
		for (int i=0; i<allUtenti.size();i++){
			if(allUtenti.get(i).getNome().equals(nome)){
				risultato.add(allUtenti.get(i));
			}
		}
		return risultato;
	}
	
	//Funzione che prende gli utenti in base solo al cognome
		private ArrayList<UtenteRegistrato> utentiConCognome (ArrayList<UtenteRegistrato> allUtenti, String cognome){
			ArrayList<UtenteRegistrato> risultato = new ArrayList<UtenteRegistrato>();
			for (int i=0; i<allUtenti.size();i++){
				if(allUtenti.get(i).getCognome().equals(cognome)){
					risultato.add(allUtenti.get(i));
				}
			}
			return risultato;
		}
}
